/**
 * @description 线程死锁例程
 * 程序说明：
 * 一个线程在运行与对象A相关联的同步语句块（这时对象A锁被锁住），并等待对象B锁打开，
 * 而同时另一个线程则在运行与对象B关联的同步语句块（这时对象B锁被锁住），并等待对象A锁打开。
 * @pageNo 431
 * @author mlmoria
 * @date 2017年2月9日
 * 
 */
package No11Thread;

public class J_Lock extends Thread{

	public static Object m_ObjectA=new Object();
	
	public static Object m_ObjectB=new Object();
	
	
	J_Lock(String s) {
		super(s);
	}
	
	public static void mb_sleep(){
		try {
			Thread.sleep((long)(Math.random()*1000));
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		boolean t=true;
		System.out.println(getName()+"开始运行");
		for(;true;t=!t){
			
			synchronized (t? m_ObjectA : m_ObjectB) {
				System.out.println(getName()+":"+(t?"对象A":"对象B")+"被锁住");
				mb_sleep();
				//应该是这里出现死锁，，，两个线程同时运行，外层一个锁住a另一个锁住b 到了内层，一个等待b，另一个等待a
				synchronized (t?  m_ObjectB : m_ObjectA) {
					System.out.println(getName()+":"+(t?"对象B":"对象A")+"被锁住");
					mb_sleep();
					System.out.println(getName()+":"+(t?"对象B":"对象A")+"的锁打开");
					
				}//内层同步语句块
				System.out.println(getName()+":"+(t?"对象A":"对象B")+"的锁打开");
				
			}//外层同步语句块
		}//for 循环
	}
	
	public static void main(String[] args) {
		J_Lock t1=new J_Lock("线程1");
		J_Lock t2=new J_Lock("线程2");
		t1.start();
		t2.start();
	}
	
}
